home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / gnustuff / minix / libsrc~1.z / libsrc~1 / bcmp.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-12-28  |  993 b   |  49 lines

  1. #include "lib.h"
  2. #define ODD(x) (((short)(x)) & 1)    /* word ops are faster */
  3.  
  4. /*
  5.  * compare n bytes efficientlty
  6.  *
  7.  * odd/even handled correctly
  8.  *
  9.  *   ++jrb  bammi@dsrgsun.ces.cwru.edu
  10.  */
  11. int bcmp(src, dst, n)
  12. _CONST register _VOIDSTAR src;
  13. _CONST register _VOIDSTAR dst;
  14. register long n;
  15. {
  16.     
  17.     if((src != dst) && (n > 0))
  18.     {
  19.     register long l, w;
  20.     
  21.     switch(ODD(src) + ODD(dst))
  22.     {
  23.       case 2: /* ODD ODD */
  24.         if(*(char *)dst++ != *(char *)src++)
  25.         return 1;
  26.         n--;
  27.         /* fall thru */
  28.         
  29.       case 0: /* EVEN EVEN */
  30.         l = (n >> 2); /* # of longs */
  31.         n -= (l << 2);
  32.         w = (n >> 1); /* # of words */
  33.         n -= (w << 1); /* n == # of residual bytes */
  34.         while(l--)
  35.         if( *((long *)dst)++ != *((long *)src)++ )
  36.             return 1;
  37.         while(w--)
  38.         if( *((short *)dst)++ != *((short *)src)++ )
  39.             return 1;
  40.         /* fall thru */
  41.       case 1: /* ODD/EVEN or EVEN/ODD */
  42.         while(n--)
  43.         if( *(char *)dst++ != *(char *)src++ )
  44.             return 1;
  45.     }
  46.     }
  47.      return 0;
  48. }
  49.